home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / hdutil.arc / MARK.ASM < prev    next >
Assembly Source File  |  1986-08-25  |  14KB  |  346 lines

  1. PAGE ,132
  2. TITLE IBM-PC Mark/UnMark-Bad-Cluster Program, Version 2.20, 25-Aug-1986
  3.  
  4. ;
  5. ; Written By Steven Georgiades
  6. ;
  7. ; IBM-PC/XT Mark/UnMark-Bad-Cluster Program
  8. ;   This program will allow you to mark or unmark a cluster on your disk as
  9. ;   bad.  It should work under all versions of DOS 2.00 and higher, and should
  10. ;   work on the PC, XT, AT, PCJr. and all compatibles.  The programs is invoked
  11. ;   as follows:
  12. ;
  13. ;         MARK [d:] [/U | /M] n [[d:] [/U | /M] n [[...]]]
  14. ;
  15. ;           d:   Optional drive letter.  If this is omitted, the default
  16. ;                drive is used.  
  17. ;
  18. ;           /U   Un-mark switch.  The following clusters will be un-marked.
  19. ;                If no switch is specified, Un-mark is assumed.
  20. ;
  21. ;           /M   Mark switch.  The following clusters will be marked bad.
  22. ;
  23. ;           n    Cluster Number, in decimal.  The first data cluster is 2.
  24. ;                (Don't blame me.  DOS defines it that way.)
  25. ;
  26. ;       If you are using this program and find it of value, your
  27. ;       contribution in any amount ($10.00 suggested) will be greatly
  28. ;       appreciated.  Makes checks payable to Steven M. Georgiades.
  29. ;               Thank you.
  30. ;
  31. ;       If you have any questions or comments about this or any other
  32. ;       SMG program, write to me at the following address:
  33. ;
  34. ;               Steven M. Georgiades
  35. ;               701-H South Hayward Street
  36. ;               Anaheim, CA 92804
  37. ;
  38.  
  39. CODE      SEGMENT BYTE PUBLIC 'CODE'
  40.  
  41.           ASSUME  CS:CODE,DS:CODE,ES:CODE,SS:CODE
  42.  
  43.           ORG     80H
  44.  
  45. PARAM     LABEL   BYTE
  46.  
  47.           ORG     100H
  48.  
  49. MARK:     JMP     BEGIN
  50.  
  51. DIGIT     DB      "0123456789ABCDEF"
  52. SIGNON    DB      "Mark, Version 2.20",13,10,10,"$"
  53.  
  54. CLSTMSG   DB      "Cluster XXXXX$"
  55. INVALID   DB      " does not exist!",7,13,10,"$"
  56.  
  57. BADMSG    DB      " is already marked as bad",13,10,"$"
  58. INUSEMSG  DB      " is currently in use by a file",13,10,"$"
  59. RESVMSG   DB      " is reserved",13,10,"$"
  60.  
  61. NOTBAD    DB      " is not marked as bad",13,10,"$"
  62.  
  63. MARKMSG   DB      " has been marked as bad",13,10,"$"
  64. UNMRKMSG  DB      " has been un-marked as bad",13,10,"$"
  65.  
  66. CLSTSEC   DW      ?
  67. CLSTTOT   DW      ?
  68. CLUST     DW      ?
  69. DRIVE     DB      ?
  70. EOF       DW      ?
  71. FATSEC    DW      ?
  72. FATSIZE   DB      ?
  73. FLAG      DB      0
  74. OLDDRV    DB      -1
  75. SECSIZE   DW      ?
  76.  
  77. BEGIN:    MOV     AH,9                          ; Output Sign-On Message
  78.           MOV     DX,OFFSET SIGNON
  79.           INT     21H
  80.           MOV     AH,19H                        ; Get Default Drive Number
  81.           INT     21H
  82.           MOV     DRIVE,AL                      ;   and Save
  83.           MOV     SI,OFFSET PARAM               ; Set up Pointer to Parameter
  84.           LODSB                                 ; Read Parameter Length
  85.           CBW
  86.           MOV     BX,AX
  87.           MOV     BYTE PTR [SI][BX],0           ; Terminate Parameter String
  88. STRIP:    LODSB                                 ; Strip Off Leading Whitespace
  89.           CMP     AL,' '
  90.           JE      STRIP
  91.           CMP     AL,9
  92.           JE      STRIP
  93.           OR      AL,AL                         ; If End-of-Parameter List,
  94.           JNZ     NOTDONE
  95.           MOV     AX,4C00H                      ;   Exit to DOS
  96.           INT     21H
  97. NOTDONE:  CMP     AL,'/'                        ; If Switch, Process
  98.           JNE     NOSWITCH
  99.           LODSB                                 ; Get Switch Letter
  100.           AND     AL,0DFH                       ; Convert to Upper Case
  101.           CMP     AL,'U'                        ; If '/U', Reset MARK Flag
  102.           JE      SWITCHU
  103.           CMP     AL,'M'                        ; If Not '/M', Next Character
  104.           JNE     STRIP
  105.           MOV     FLAG,-1                       ; Else Set MARK Flag
  106.           JMP     SHORT STRIP
  107. SWITCHU:  MOV     FLAG,0                        ; Reset MARK Flag
  108.           JMP     SHORT STRIP
  109. NOSWITCH: LODSB                                 ; Get Drive Letter
  110.           CMP     AL,':'
  111.           JNE     NODRIVE
  112.           INC     SI
  113.           AND     AL,0DFH                       ; Convert to Upper Case
  114.           SUB     AL,'A'                        ; Convert to Drive Number 
  115.           MOV     DRIVE,AL                      ; Save Drive Number
  116.           JMP     STRIP                         ; Get Next Paramter
  117. NODRIVE:  SUB     SI,2                          ; ReUse Last Character
  118.           CALL    GET_WORD                      ; Read Cluster Number (Hex)
  119.           MOV     CLUST,DX                      ; Save Cluster Number
  120.           MOV     AL,DRIVE                      ; If Different Drive,
  121.           CMP     AL,OLDDRV
  122.           JE      DRV_OK
  123.           PUSH    SI                            ;   Save Parameter Pointer
  124.           MOV     OLDDRV,AL                     ;   Save New Drive
  125.           MOV     BX,OFFSET FATBUF              ;   Read Boot Record
  126.           MOV     CX,1
  127.           MOV     DX,0
  128.           INT     25H
  129.           POPF
  130.           MOV     AX,FATBUF[11]                 ;   Read Sector Size and Save
  131.           MOV     SECSIZE,AX
  132.           MOV     AL,BYTE PTR FATBUF[13]        ;   Read Sectors/Cluster and Save
  133.           XOR     AH,AH
  134.           MOV     CLSTSEC,AX
  135.           MOV     BX,FATBUF[22]                 ;   Read Sectors/FAT and Save
  136.           MOV     FATSEC,BX
  137.           MOV     AH,36H                        ;   Get Total Data Clusters
  138.           MOV     DL,DRIVE
  139.           INC     DL
  140.           INT     21H
  141.           ADD     DX,2
  142.           MOV     CLSTTOT,DX                    ;     and Save
  143.           MOV     FATSIZE,3
  144.           MOV     EOF,0FF8H
  145.           CMP     DX,4081                       ;   If Necessary, Adjust FAT Size
  146.           JLE     FAT_OK
  147.           MOV     FATSIZE,4
  148.           MOV     EOF,0FFF8H
  149. FAT_OK:   MOV     AL,DRIVE                      ;   Read FAT
  150.           MOV     CX,FATSEC
  151.           MOV     DX,1
  152.           MOV     BX,OFFSET FATBUF
  153.           INT     25H
  154.           POPF
  155.           POP     SI                            ;   Restore Parameter Pointer
  156. DRV_OK:   MOV     BX,CLUST                      ; Get Cluster Number
  157.           MOV     AX,BX                         ; Convert Cluster No. to ASCII
  158.           MOV     DI,OFFSET CLSTMSG[13]
  159.           CALL    DEC5OUT
  160.           CALL    STRIP0                        ; Strip Off Leading Zeroes
  161.           MOV     AH,9                          ; Output Cluster Message
  162.           MOV     DX,OFFSET CLSTMSG
  163.           INT     21H
  164.           CMP     BX,CLSTTOT                    ; If Invalid, Say So
  165.           JAE     CLST_BAD
  166.           CMP     BX,2
  167.           JAE     CLST_OK
  168. CLST_BAD: MOV     DX,OFFSET INVALID
  169.           JMP     SHORT ERROUT
  170. CLST_OK:  CALL    NEXTCLST                      ; Get Next Cluster Number
  171.           MOV     AX,EOF                        ; Get EOF Value
  172.           CMP     FLAG,0                        ; If /U, Unmark
  173.           JE      UNMARK
  174.           OR      BX,BX                         ; Else Mark
  175.           JZ      IS_FREE
  176.           CMP     BX,AX                         ; If Reserved,
  177.           JB      NOTINUSE
  178. IN_USE:   MOV     DX,OFFSET INUSEMSG
  179.           JMP     SHORT ERROUT                  ; Output Error Message
  180. NOTINUSE: DEC     AX
  181.           CMP     BX,AX
  182.           JNE     NOT_BAD
  183.           MOV     DX,OFFSET BADMSG
  184.           JMP     SHORT ERROUT
  185. NOT_BAD:  SUB     AX,7
  186.           CMP     BX,AX
  187.           JB      IN_USE
  188.           MOV     DX,OFFSET RESVMSG
  189.           JMP     SHORT ERROUT
  190. IS_FREE:  MOV     BX,CLUST                      ; Get Cluster Number
  191.           MOV     AX,EOF                        ; New Value = Bad Cluster
  192.           DEC     AX
  193.           MOV     DX,OFFSET MARKMSG
  194.           JMP     WRT_FAT
  195. UNMARK:   DEC     AX
  196.           CMP     BX,AX                         ; If Not Bad,
  197.           JE      IS_BAD
  198.           MOV     DX,OFFSET NOTBAD
  199. ERROUT:   MOV     AH,9                          ; Output Error Message
  200.           INT     21H
  201.           JMP     STRIP
  202. IS_BAD:   MOV     BX,CLUST                      ; Get Cluster Number
  203.           XOR     AX,AX                         ; New Value = Good Cluster
  204.           MOV     DX,OFFSET UNMRKMSG
  205. WRT_FAT:  PUSH    DX
  206.           CALL    SETCLST
  207.           PUSH    SI                            ; Save Parameter Pointer
  208.           MOV     AL,DRIVE                      ; Write FAT #1
  209.           MOV     CX,FATSEC
  210.           MOV     DX,1
  211.           MOV     BX,OFFSET FATBUF
  212.           INT     26H
  213.           POPF
  214.           MOV     AL,DRIVE                      ; Write FAT #2
  215.           MOV     CX,FATSEC
  216.           MOV     DX,CX
  217.           INC     DX
  218.           MOV     BX,OFFSET FATBUF
  219.           INT     26H
  220.           POPF
  221.           POP     SI                            ; Restore Parameter Pointer
  222.           MOV     AH,9                          ; Output UnMarked Message
  223.           POP     DX
  224.           INT     21H
  225.           JMP     STRIP
  226.  
  227. NEXTCLST: CMP     FATSIZE,3                     ; If FAT Size = 16 Bits,
  228.           JE      NEXT_12
  229.           SHL     BX,1                          ;   Simply Read Next Cluster #
  230.           MOV     BX,FATBUF[BX]
  231.           RET                                   ;   Done
  232. NEXT_12:  PUSH    CX                            ; Save Registers
  233.           MOV     CX,BX                         ; Word # = Cluster # * 1.5
  234.           SHL     CX,1
  235.           ADD     BX,CX
  236.           SHR     BX,1
  237.           MOV     BX,FATBUF[BX]
  238.           JNC     NEXT_OK                       ; If Odd, Use 12 MSB's
  239.           MOV     CL,4
  240.           SHR     BX,CL
  241. NEXT_OK:  AND     BX,0FFFH                      ; Else Use 12 LSB's
  242.           POP     CX                            ; Restore Registers
  243.           RET                                   ; Done
  244.  
  245. SETCLST:  PUSH    AX                            ; Save Registers
  246.           PUSH    BX
  247.           CMP     FATSIZE,3                     ; If FAT Size = 16 Bits,
  248.           JE      SETC_12
  249.           SHL     BX,1                          ;   Simply Read Next Cluster #
  250.           MOV     FATBUF[BX],AX
  251.           JMP     SHORT SET_DONE                ;   Done
  252. SETC_12:  PUSH    CX                            ; Save Registers
  253.           MOV     CX,BX                         ; Word # = Cluster # * 1.5
  254.           SHL     CX,1
  255.           ADD     BX,CX
  256.           SHR     BX,1
  257.           MOV     CX,0F000H
  258.           JNC     SETC_OK                       ; If Odd, Use 12 MSB's
  259.           MOV     CL,4
  260.           SHL     AX,CL
  261.           MOV     CX,0FH
  262. SETC_OK:  AND     FATBUF[BX],CX
  263.           OR      FATBUF[BX],AX
  264.           POP     CX
  265. SET_DONE: POP     BX
  266.           POP     AX
  267.           RET                                   ; Done
  268.  
  269. GET_WORD: PUSH    BX                            ; Save Register
  270.           XOR     DX,DX                         ; Value = 0
  271. GET_WRD1: LODSB                                 ; Read Character
  272.           CMP     AL,'0'                        ; If Not Numeric, Done
  273.           JB      GET_WRD2
  274.           CMP     AL,'9'
  275.           JA      GET_WRD2
  276.           SUB     AL,'0'                        ; Convert to BCD
  277.           CBW
  278.           MOV     BX,AX                         ; Value = Value*10+BCD
  279.           MOV     AX,10
  280.           MUL     DX
  281.           ADD     AX,BX
  282.           MOV     DX,AX
  283.           JMP     GET_WRD1                      ; Repeat
  284. GET_WRD2: DEC     SI
  285.           POP     BX                            ; Restore Register
  286.           RET                                   ; Done
  287.  
  288. STRIP0:   CMP     BYTE PTR [DI],'0'             ; If Character != '0', Done
  289.           JNE     STRIP1
  290.           CMP     BYTE PTR [DI+1],'0'           ; If Next Character != Digit,
  291.           JL      STRIP1                        ;   Done
  292.           CMP     BYTE PTR [DI+1],'9'
  293.           JG      STRIP1
  294.           MOV     BYTE PTR [DI],' '             ; Change '0' to ' '
  295.           INC     DI                            ; Point to Next Character
  296.           JMP     SHORT STRIP0                  ; Repeat
  297. STRIP1:   RET                                   ; Done
  298.  
  299. DEC2OUT:  PUSH    AX                            ; Save Registers
  300.           PUSH    BX
  301.           XOR     AH,AH                         ; Clear AH
  302.           MOV     BL,10                         ; AH=AX%10,AL=AX/10
  303.           DIV     BL
  304.           ADD     AX,'00'                       ; Convert to ASCII
  305.           SUB     DI,2
  306.           MOV     [DI],AX                       ; Store in String
  307.           POP     BX                            ; Restore Registers
  308.           POP     AX
  309.           RET                                   ; Done
  310.  
  311. DEC4OUT:  PUSH    AX                            ; Save Registers
  312.           PUSH    BX
  313.           MOV     BL,100                        ; AH=AX%100,AL=AX/100
  314.           DIV     BL
  315.           XCHG    AH,AL                         ; Convert 2 LSD's
  316.           CALL    DEC2OUT
  317.           XCHG    AH,AL                         ; Convert 2 MSD's
  318.           CALL    DEC2OUT
  319.           POP     BX                            ; Restore Registers
  320.           POP     AX
  321.           RET                                   ; Done
  322.  
  323. DEC5OUT:  PUSH    AX                            ; Save Registers
  324.           PUSH    BX
  325.           PUSH    DX                            ; DX=AX%10000,AX=AX/10000
  326.           MOV     BX,10000
  327.           XOR     DX,DX
  328.           DIV     BX
  329.           XCHG    DX,AX                         ; Convert 4 LSD's
  330.           CALL    DEC4OUT
  331.           XCHG    DX,AX                         ; Convert MSD
  332.           ADD     AL,'0'
  333.           SUB     DI,1
  334.           MOV     [DI],AL
  335.           POP     DX                            ; Restore Registers
  336.           POP     BX
  337.           POP     AX
  338.           RET                                   ; Done
  339.  
  340. FATBUF    LABEL   WORD
  341.  
  342. CODE      ENDS
  343.  
  344.           END     MARK
  345.